package com.tedu.api.list;

import org.junit.Test;
/**
 * 导入包问题：同一包下的类需要导入
 *       import java.util.ArrayList;
 *       import java.util.List;
 *通配符  *  匹配当前包【文件夹】下所有的类
 *         import java.util.*
 */

import java.util.*;


/**
 * List集合
 * Collection顶级集合【容器】----Lise集合【子接口】
 * List集合存储数据:存储有序并且重复的元素
 * List集合---接口---无法创建对象
 * 实现类：
 * ArrayList：【常用：List与ArrayList的方法完全一致】数组实现
 * LinkedList：双向链接实现
 * Vector：JDK1.0版本：性能：增删效率慢，线程安全！--ArrayList
 * 重点：掌握List接口集合中所有方法
 */
public class ListAPI {
    /**
     * get(int index)   返回值：E ---理解：Object
     * 作用：获取给定下标处元素，从0开始
     */
    @Test
    public void testGet(){
        List<String> list=new ArrayList<>();
        list.add("三生三世");
        list.add("你的名字");
        list.add("咒怨");
        System.out.println("List集合:"+list);
        //获取到：List集合中元素叫：你的名字
        String str=list.get(1);
        System.out.println("获取集合中："+str);
        //需求：获取List集合中所有的元素 ---for
        for (int i=0;i<list.size();i++){//针对集合----下标；从0开始
            list.get(i);
            System.out.println("遍历List集合："+str);
        }
    }

    /**
     * set(int index,E e)返回值：E
     * 作用：将给定元素设置到指定的下标位置处
     */
    @Test
    public void testSet(){
        List<String> list=new ArrayList<>();
        //Collection 提供add方法|List 提供add方法【重写】
        list.add("三生三世");
        list.add("你的名字");
        list.add("咒怨");
        //需求：List集合中元素“你的名字”修改为749局
        list.set(1,"749");
        System.out.println("修改后List集合："+list);
    }
    /**List继承Collection[重载:拓展功能]
     * add(int index,E e)     返回值：void
     * 作用：将给定元素插入到指定位置
     * remove(int index)      返回值：E
     * 作用：将给定位置的元素从集合中删除
     *
     * 特点：查询快、增删慢---选择List/ArrayList
     */
    @Test
    public void testAR(){
        //创建List集合---重写方法add() 重载方法add(下标，“元素”)
        List<String> list=new ArrayList<>();
        list.add("时代少年团");
        list.add("马嘉祺");
        list.add("丁程鑫");
        list.add("刘耀文");
        list.add("宋亚轩");
        list.add("范嘉琦");
        System.out.println("List集合："+list);
        list.add(3,"张真源");
        System.out.println("List集合元素："+list);
        list.remove(6);
        System.out.println("List集合元素："+list);
    }

    /**
     *List集合
     * subList(int start,int end)   返回值：<List>E
     * 作用：截取范围内子集   口诀：含头不含尾
     */
    @Test
    public void testSubList() {
        //创建集合，10个元素:0~9
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {//i 针对循环下标
            list.add(i);
        }
        System.out.println("List集合：" + list);
        //获取子集：list集合元素中3~8之间元素
        List<Integer> listch = list.subList(3, 9);
        System.out.println("获取子集：" + listch);
        System.out.println("List集合：" + list);
        //获取子集：list集合元素中2~6之间元素，子集元素扩大10倍
        //1.从List集合中，取2~6之间元素
        List<Integer> list1 = list.subList(2, 7);
        //2.for循环遍历子集，遍历同时给每个下标的元素*10
        for (int i = 0; i < list1.size(); i++) {//i 获取下标
            list1.set(i, list1.get(i) * 10);
        }
        System.out.println("子集扩大十倍：" + list1);
        /**
         * 需求；清空list1子集 输出：list  【0，1，2，3，4，5，6，7】
         *特点：清空clear以及设置set直接对集合做操作
         */
        list1.clear();
        System.out.println("清空子集：【list】"+list);
    }

    /**
     * 集合排序
     * Random   伪随机数类  包位置：Java.util
     * nextInt(数值)  返回值一个伪随机整数【0~数值】
     * Collections 集合工具类  静态方法：sort
     * sort()方法：针对集合元素是数值进行排序【默认：升序】！返回值：List
     *
     * 需求：随机生成10个元素【整数:100以内】的集合---对集合排序
     */
   @Test
    public void testArrayList(){
        //创建List集合<整数>
       List<Integer>list=new ArrayList<>();
       //创建伪随机数
       Random r=new Random();
       for (int i=0;i<10;i++){
           list.add(r.nextInt(100));//100以内
       }
       System.out.println("打印List:"+list);
       //对list集合元素进行排序 Collections.sort(集合)
       Collections.sort(list);
       System.out.println("【有排序】打印list："+list);
    }

    /**
     * 需求：创建集合，存汉字，排序---能排【无规则】
     * sort(集合，Comparator)   重载功能：拓展排序功能
     * 集合：排序集合
     * Comparator比较器:指定规则--【定规则：按照字符串长短排序】
     * 重写：Comparator()--定义比较器规则，默认自带交换功能
     */
    @Test
    public void testComparator(){
        //创建集合--存：汉字
        List<String>list=new ArrayList<>();
        list.add("阿西吧");
        list.add("搜嘎寺内");
        list.add("呦西");
        //比较器接口规则定义：按照字符串长短排序
        //Comparator比较器接口--创建一次对象--采用匿名内部类
        Comparator<String> com=new Comparator<String>(){
            //compare方法：针对集合【自定义】排序
            //参数1：泛型：Object o1 集合中假设第一【交换】个元素
            //参数2：泛型：Object o2 集合中假设第二【交换】个元素
            public int compare(String o1,String o2) {
                /**
                 * 返回值 大于0
                 * 返回值 等于0    3~4不交换
                 * 返回值 小于0
                 */
            return o1.length()-o2.length();
            }
        };
        Collections.sort(list);
        System.out.println("排序后集合："+list);
    }
}
